package GestionBilleterie;

import GestionPlannification.*;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

/**
 * Classe représentant une réservation d'un client pour une représentation
 * @author Aude Legrand, Alexandre Becquet
 */
public class Reservation {
	private int num;
	private Client client;
    private Vendeur vendeur;
	private Representation representation;
    private Tarif tarif;

    /**
     * Constructeur d'une Reservation pour une réservation récupérée de la BD
     * @param num le num de la reservation
     * @param client le client
     * @param tarif le tarif
     * @param representation la representation
     * @param vendeur la vendeur
     */
    public Reservation(int num, Client client,Tarif tarif, Representation representation, Vendeur vendeur){
        this.vendeur=vendeur;
        this.num=num;
        this.client=client;
        this.tarif=tarif;
        this.representation=representation;
    }

    /**
     * Constructeur de la classe Reservation sans identifiant de la BD,
     * Ajoute la Reservation à la base de donnée.
     * @param client le client
     * @param tarif le tarif
     * @param representation la representation
     * @param vendeur le vendeur
     */
    public Reservation(Client client,Tarif tarif, Representation representation, Vendeur vendeur){
        this.vendeur=vendeur;
        this.client=client;
        this.representation=representation;
        try {
            if(vendeur!=null)
                ReservationBD.ajoutReservation(representation.getId(), client.getId(), tarif.getId(),vendeur.getId());
            else
                ReservationBD.ajoutReservation(representation.getId(), client.getId(), tarif.getId(),0);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Retourne toutes les Réservations
     * @return La liste des réservations
     */
    public static List<Reservation> findEntities(){
        List<Reservation> lesReservations = null;
        try {
             lesReservations= ReservationBD.readAllReservations();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return lesReservations;
    }

    /**
     * Recherche une Reservation grâce à son id
     * @param idReservation L'id de la réservation recherchée
     * @return
     */
    public static Reservation findEntitie(int idReservation){
        Reservation r = null;
        try {
            r=ReservationBD.readReservation(idReservation);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return r;
    }

    /**
     * Recherche des Reservations d'une Representation
     * @param representation la representation
     * @return la liste des Reservations trouvées
     */
    public static List<Reservation> searchReservations(Representation representation){
        List<Reservation> lesReservations = null;
        try {
             lesReservations= ReservationBD.realAllReservations(representation);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return lesReservations;
    }

    /**
     * Retourne la date de la Reservation
     * @return la date de la Reservation
     */
	public Date getDateReservation() {
        return this.representation.getDateRepresentation();
	}

    /**
     * Retourne le Client de la Reservation
     * @return le Client de la Reservation
     */
	public Client getClient() {
        return this.client;
	}

    /**
     * Retourne le Tarif de la Reservation
     * @return le Tarif de la Reservation
     */
    public Tarif getTarif(){
        return this.tarif;
    }

    /**
     * Retourne le numéro de la Reservation
     * @return le numéro de la Reservation
     */
    public int getNum(){
        return this.num;
    }

    /**
     * Retourne le Vendeur de la Reservation
     * @return le Vendeur de la Reservation
     */
    public Vendeur getVendeur(){
        return this.vendeur;
    }

    /**
     * Retourne la Representation de la Reservation
     * @return la Representation de la Reservation
     */
	public Representation getRepresentation() {
        return this.representation;
	}
}
